class Solution {
public:
    bool isNumber(const char *s) {
        // Start typing your C/C++ solution below
        // DO NOT write int main() function
      if (s == NULL) {
        return false;
      }
      int n = strlen(s);
      int begin = 0;
      int end = n - 1;

      while (begin < n && s[begin] == ' ') {
        ++begin;
      }
      while (end >= 0 && s[end] == ' ') {
        --end;
      }
      if (begin > end) {
        return false;
      }

      int e_pos = begin;
      while (e_pos <= end && s[e_pos] != 'e') {
        ++e_pos;
      }

      // [begin, e_pos - 1]
      bool left = false;
      bool right = false;
      for (int i = begin; i < e_pos; ++i) {
        if (i == begin && (s[i] == '+' || s[i] == '-')) {
          continue;
        }
        if (s[i] == '.') {
          for (int j = i + 1; j < e_pos; ++j) {
            if (!(s[j] >= '0' && s[j] <= '9')) {
              return false;
            }
            right = true;
          }
          break;
        } else if (!(s[i] >= '0' && s[i] <= '9')) {
          return false;
        }
        left = true;
      }

      if (!left && !right) {
        return false;
      }
      if (e_pos > end) {
        return true;
      }

      // [e_pos + 1, end]
      left = false;
      right = false;
      for (int i = e_pos + 1; i <= end; ++i) {
        if (i == e_pos + 1 && (s[i] == '+' || s[i] == '-')) {
          continue;
        }

        if (!(s[i] >= '0' && s[i] <= '9')) {
          return false;
        }
        left = true;
      }
      if (!left) {
        return false;
      }
      return true;

    }
};
